import java.util.Stack;

public class Solution {
    public static void main(String[] args) {
        Solution s = new Solution();

        System.out.println(s.calculate("1 + 2 * 3 + 12"));
    }

    public int calculate(String s) {
        /**
         * 基本计算器Ⅱ
         * 思路：
         *  双栈模拟 + 分情况讨论*/
        // 1 预处理
        Stack<Integer> stack = new Stack<>();
        // -处理字符串中的空字符串
        s = s.replaceAll(" ", "");
        int n = s.length();
        char op = '+';

        // 2 循环遍历模拟
        int i = 0;
        while(i < n) {
            if(s.charAt(i) >= '0' && s.charAt(i) <= '9') {
                // -数字
                // -1 获取当前值（可能存在多位数，所以循环步进）
                int temp = 0;
                while(i < n && s.charAt(i) >= '0' && s.charAt(i) <= '9') {
                    temp = temp * 10 + (s.charAt(i++) - '0');
                }

                // -2 根据最近前置操作符处理当前值
                if(op == '+') {
                    stack.push(temp);
                } else if(op == '-') {
                    stack.push(-temp);
                } else if(op == '*') {
                    stack.push(stack.pop() * temp);
                } else if(op == '/') {
                    stack.push(stack.pop() / temp);
                }
            } else {
                // -操作符
                op = s.charAt(i++);
            }
        }

        // 3 加和栈中元素并返回
        int answer = 0;
        while(!stack.isEmpty()) {
            answer += stack.pop();
        }
        return answer;
    }
}
